#include <QCoreApplication>
#include <QString>
#include <QStack>
#include <QDebug>

// 将路径切割并存入栈中
QStack<QString> splitPath(const QString& path) {
    QStack<QString> pathStack;
    QStringList segments = path.split('/', QString::SkipEmptyParts);

    // 将路径片段存入栈中
    for (const QString& segment : segments) {
        pathStack.push(segment);
    }

    return pathStack;
}

// 获取当前路径字符串
QString getPath(const QStack<QString>& pathStack) {
    QStringList segments;
    for (const QString& segment : pathStack) {
        segments.append(segment);
    }
    /* join将QStringList以一个字符串链接起来 */
    return '/' + segments.join('/');
}

// 实现 cd 子目录
void cd(QStack<QString>& pathStack, const QString& subDir) {
    if (!subDir.isEmpty()) {
        pathStack.push(subDir);
    }
}

// 实现 cd 上一级
void cdUp(QStack<QString>& pathStack) {
    if (!pathStack.isEmpty()) {
        pathStack.pop();
    }
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QString path = "/usr/include/dir1/dir2";
    QStack<QString> pathStack = splitPath(path);

    qDebug() << "Initial Path:" << getPath(pathStack);

    // cd 子目录
    cd(pathStack, "newDir");
    qDebug() << "After cd newDir:" << getPath(pathStack);

    // cd 上一级
    cdUp(pathStack);
    qDebug() << "After cd ..:" << getPath(pathStack);

    // 再次 cd 上一级
    cdUp(pathStack);
    qDebug() << "After cd ..:" << getPath(pathStack);

    return a.exec();
}

